package org.mybaits.chapter1.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybaits.chapter1.dao.UserDao;
import org.mybaits.chapter1.entitys.User;


/**
 * 
 *@Description: 基于dao接口的实现类开发(原始开发)
 *		传统 Dao 开发的问题 ：
 *			1. dao 实现类中存在大量的模板方法，如打开session, 提交，关闭session 等，
 *			2. 在调用sqlSession 方法时，硬编码了
 *@author huangkai
 *@date 2016年12月9日 下午10:50:25
 *@version V1.0.0
 */
public class UserDaoImpl implements UserDao {

	
	/**
	 * 定义 sqlSessionFactory
	 */
	private SqlSessionFactory sqlSessionFactory;
	
	//不能在这里定义  SqlSession ,因为SqlSession 是线程不安全的类，不能定义为全局变量，只能在每个方法中获取，
//	private SqlSession sqlSession;
	/**
	 * 通过构造方法注入，
	 * @param sqlSessionFactory
	 */
	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public User getById(Long id) throws Exception {
		SqlSession session = null;
		try{
			session = sqlSessionFactory.openSession();
			// 第一个参数为 mapper.xml 中的 namespace + "." + 执行sql标签的 id
			return session.selectOne("user.getById", id);// 第一个参数硬编码
		}finally {
			if(null != session){
				session.close();
			}
		}
	}

	@Override
	public int insert(User user) throws Exception {
		SqlSession session = null;
		try{
			session = sqlSessionFactory.openSession();
			// 第一个参数为 mapper.xml 中的 namespace + "." + 执行sql标签的 id
			int rows = session.insert("user.insertUser", user); // 第一个参数硬编码
			session.commit();
			return rows;
		}finally {
			if(null != session){
				session.close();
			}
		}
	}

	@Override
	public int deleteById(Long id) throws Exception {
		SqlSession session = null;
		try{
			session = sqlSessionFactory.openSession();
			// 第一个参数为 mapper.xml 中的 namespace + "." + 执行sql标签的 id
			int rows = session.delete("user.deleteById", id);// 第一个参数硬编码
			session.commit();
			return rows;
		}finally {
			if(null != session){
				session.close();
			}
		}
	}

	@Override
	public int update(User user) throws Exception {
		SqlSession session = null;
		try{
			session = sqlSessionFactory.openSession();
			// 第一个参数为 mapper.xml 中的 namespace + "." + 执行sql标签的 id
			int rows = session.update("user.updateUser", user);// 第一个参数硬编码
			session.commit();
			return rows;
		}finally {
			if(null != session){
				session.close();
			}
		}
	}

	@Override
	public List<User> getByUsername(String username) throws Exception {
		SqlSession session = null;
		try{
			session = sqlSessionFactory.openSession();
			// 第一个参数为 mapper.xml 中的 namespace + "." + 执行sql标签的 id
			return session.selectList("user.getUsername", username);// 第一个参数硬编码
		}finally {
			if(null != session){
				session.close();
			}
		}
	}

	@Override
	public User insertReturnUser(User user) throws Exception {
		SqlSession session = null;
		try{
			session = sqlSessionFactory.openSession();
			// 第一个参数为 mapper.xml 中的 namespace + "." + 执行sql标签的 id
			int rows = session.insert("user.insertReturnUser", user);
			session.commit();
			return rows > 0 ? user : null;
		}finally {
			if(null != session){
				session.close();
			}
		}
	}
}
